import router from "./router";
import store from "./store";
import { Message } from "element-ui";
import NProgress from "nprogress"; // progress bar
import "nprogress/nprogress.css"; // progress bar style
import { getToken } from "@/utils/auth"; // get token from cookie
import getPageTitle from "@/utils/get-page-title";

NProgress.configure({ showSpinner: false }); // NProgress Configuration

const whiteList = ["/login", "/auth-redirect"]; // no redirect whitelist

router.beforeEach(async (to, from, next) => {
	// start progress bar
	NProgress.start();

	// set page title
	document.title = getPageTitle(to.meta.title);

	// determine whether the user has logged in
	const hasToken = getToken();

	if (hasToken) {
		if (to.path === "/login") {
			// if is logged in, redirect to the home page
			next({ path: "/" });
			NProgress.done(); // hack: https://github.com/PanJiaChen/vue-element-admin/pull/2939
		} else {
			// determine whether the user has obtained his permission roles through getInfo
			const hasRoles = store.getters.roles && store.getters.roles.length > 0;
			if (hasRoles) {
				next();
			} else {
				try {
					// get user info
					// note: roles must be a object array! such as: ['admin'] or ,['developer','editor']
					const { roles } = await store.dispatch("user/getInfo");

					// generate accessible routes map based on roles
					const accessRoutes = await store.dispatch(
						"permission/generateRoutes",
						roles
					);

					// dynamically add accessible routes
					router.addRoutes(accessRoutes);

					// hack method to ensure that addRoutes is complete
					// set the replace: true, so the navigation will not leave a history record
					next({ ...to, replace: true });
				} catch (error) {
					// remove token and go to login page to re-login
					await store.dispatch("user/resetToken");
					Message.error(error || "Has Error");
					next(`/login?redirect=${to.path}`);
					NProgress.done();
				}
			}
		}
	} else {
		/* has no token*/

		if (whiteList.indexOf(to.path) !== -1) {
			// in the free login whitelist, go directly
			next();
		} else {
			// other pages that do not have permission to access are redirected to the login page.
			next(`/login?redirect=${to.path}`);
			NProgress.done();
		}
	}
});

router.afterEach(() => {
	// finish progress bar
	NProgress.done();
});
